#!/usr/bin/env node

/**
 * 版本号自动递增脚本
 * 在构建前自动递增package.json中的版本号
 * 并收集发布信息存储到release-info.json
 */

const fs = require('fs');
const path = require('path');
const readline = require('readline');

/**
 * 递增版本号
 * @param {string} version 当前版本号
 * @param {string} type 递增类型 (patch, minor, major)
 * @returns {string} 新版本号
 */
function bumpVersion(version, type = 'patch') {
  const parts = version.split('.').map(Number);
  
  switch (type) {
    case 'major':
      parts[0]++;
      parts[1] = 0;
      parts[2] = 0;
      break;
    case 'minor':
      parts[1]++;
      parts[2] = 0;
      break;
    case 'patch':
    default:
      parts[2]++;
      break;
  }
  
  return parts.join('.');
}

/**
 * 更新package.json中的版本号
 * @param {string} newVersion 新版本号
 * @returns {boolean} 是否更新成功
 */
function updatePackageVersion(newVersion) {
  try {
    const packagePath = path.join(__dirname, '../package.json');
    const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
    
    const oldVersion = packageData.version;
    packageData.version = newVersion;
    
    // 写入文件
    fs.writeFileSync(packagePath, JSON.stringify(packageData, null, 2) + '\n');
    
    console.log(`✅ 版本号已更新: ${oldVersion} → ${newVersion}`);
    return true;
  } catch (error) {
    console.error('❌ 更新版本号失败:', error.message);
    return false;
  }
}

/**
 * 获取当前版本号
 * @returns {string} 当前版本号
 */
function getCurrentVersion() {
  try {
    const packagePath = path.join(__dirname, '../package.json');
    const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
    return packageData.version;
  } catch (error) {
    console.error('读取版本号失败:', error.message);
    return '1.0.0';
  }
}

/**
 * 交互式收集发布信息
 * @returns {Promise<Object>} 发布信息对象
 */
function collectReleaseInfo() {
  return new Promise((resolve) => {
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });

    const releaseInfo = {};

    console.log('\n📝 请输入发布信息:');

    rl.question('更新标题: ', (title) => {
      releaseInfo.title = title || '常规更新';

      rl.question('发布日期 (留空使用当前日期): ', (date) => {
        releaseInfo.date = date || new Date().toISOString().split('T')[0];

        rl.close();
        resolve(releaseInfo);
      });
    });
  });
}

/**
 * 保存发布信息到 release-info.json (只保留最新的一条)
 * @param {string} version 版本号
 * @param {Object} releaseInfo 发布信息
 */
function saveReleaseInfo(version, releaseInfo) {
  try {
    const releaseInfoPath = path.join(__dirname, '../release-info.json');

    // 只保存最新的发布信息
    const latestRelease = {
      version,
      title: releaseInfo.title,
      date: releaseInfo.date,
      timestamp: new Date().toISOString()
    };

    // 直接写入单条记录的数组
    fs.writeFileSync(releaseInfoPath, JSON.stringify([latestRelease], null, 2) + '\n');

    console.log('✅ 发布信息已保存到 release-info.json (仅保留最新版本)');
  } catch (error) {
    console.error('❌ 保存发布信息失败:', error.message);
  }
}

/**
 * 主函数
 */
async function main() {
  const args = process.argv.slice(2);
  const type = args[0] || 'patch';
  
  if (!['patch', 'minor', 'major'].includes(type)) {
    console.error('❌ 无效的版本类型，请使用: patch, minor, 或 major');
    process.exit(1);
  }
  
  const currentVersion = getCurrentVersion();
  const newVersion = bumpVersion(currentVersion, type);
  
  console.log(`🔄 准备更新版本号...`);
  console.log(`当前版本: ${currentVersion}`);
  console.log(`更新类型: ${type}`);
  console.log(`新版本: ${newVersion}`);
  
  if (updatePackageVersion(newVersion)) {
    console.log(`\n🎉 版本号更新成功！`);
    
    // 收集发布信息
    const releaseInfo = await collectReleaseInfo();
    
    // 保存发布信息
    saveReleaseInfo(newVersion, releaseInfo);
    
    console.log(`\n📋 发布信息:`);
    console.log(`   版本: ${newVersion}`);
    console.log(`   标题: ${releaseInfo.title}`);
    console.log(`   日期: ${releaseInfo.date}`);
    console.log(`\n现在可以执行构建命令了。`);
    
    // 输出新版本号供其他脚本使用
    process.stdout.write(newVersion);
  } else {
    process.exit(1);
  }
}

// 如果直接运行此脚本
if (require.main === module) {
  main().catch(error => {
    console.error('脚本执行失败:', error);
    process.exit(1);
  });
}

module.exports = { bumpVersion, updatePackageVersion, getCurrentVersion, collectReleaseInfo, saveReleaseInfo };
